了解原理能夠讓我降低對這些科技未知的恐懼,並且幫助我更快的上手使用這些工具
SSH 連線簡單來說有三個步驟:
當我們輸入 ssh user@host
後,伺服器會先傳送一個隨機字串給我們,然後我們會用自己的私鑰對它簽名,簽完名後再回傳給伺服器,最後伺服器會從伺服器上的 ~/.ssh/authorized_keys
找出可以驗證這個簽名的公鑰,如果有找到符合的公鑰,那就驗證成功。
公鑰和私鑰是什麼?為什麼可以驗證身分?
非對稱式加密
這是一種神奇的加密方式,它的加密和解密的鑰匙是不同一把,用公鑰加密的資料只能用用私鑰解開,而私鑰只在擁有者收中,公鑰可以有很多人擁有,現在主流的非對稱加密有兩種 rsa、ed25519,也可以說是兩種產生公私鑰對的方式,以下是一個比較簡單的例子:
公鑰 73
和 私鑰 137
公鑰 73
用一個安全的方式交給 Alice公鑰 73
對 訊息 1234
加密,73 x 1234 = 90082,獲得 密文 90082
密文 90082
用不安全的方式傳給 Bob,這時 Carol 看了看密文完全不知道在寫什麼私鑰 137
解密傳過來的 密文 90082
,137 x 90082 = 12341234,獲得 原始訊息 1234
事實上 rsa、ed25519 不是一般的乘法運算,但其實滿像的,因為他們也符合 私鑰 x 公鑰 x 訊息 = 訊息
(x 是某種運算方式,也許是乘法運算,也許是矩陣運算) 的運算方式,不過運作方式更複雜、更難以理解、也更安全。
數位簽章
為了方便理解,數位簽章可以想像成就是把非對稱加密反過來用,用私鑰加密後,任何人都能用公鑰解密,藉此就能知道訊息是本人傳送的。
不過實際運作方式並不會直接用私鑰對資料加密,因為用非對稱加密加密大檔案速度會很慢,所以通常都是先對資料做雜湊,再用私鑰對雜湊值加密,對方收到資料後也對資料做雜湊,並且用公鑰對加密的雜湊值解密,最後將兩個湊值比對,如果相同那表示傳訊息過來的是本人,而且沒有被竄改。
在第一次連線時伺服器會將伺服器的公鑰傳送給我,現在有兩對公私鑰對,一對是我的、一對是伺服器的,現在伺服器上有我的公鑰和伺服器的私鑰,我的電腦中有伺服器的公鑰和我的私鑰。
接著會利用這四把鑰匙來產生一對對稱式金鑰,用於 AES 加解密,然後在 AES 加密的情況下傳送資料,因為 非對稱式加密
比 對稱式加密
慢的非常非常多,如果要傳送比較大的資料那可能算半天都算不出密文。
Diffie-Hellman 算法
SSH 是利用 Diffie-Hellman 來產生對稱式金鑰的,不過在交流的過程中加入了身分驗證,確認訊息的傳送者,具體流程也是滿複雜的,以下是拿掉身分驗證後的例子:
53
(這個值是共有的)19
(這個值只有 Alice 知道),然後將它和 53 做運算,19 x 53 = 1007
17
,17 x 53 = 901
19
對 Bob 傳過來的 901
做運算,19 x 901 = 17119
1007
做運算,17 x 1007 = 17119
17119
這個值,並且中間過程沒任何人可以拿到這個值這樣 Alice 和 Bob 都能用 17119
這個值對訊息加解密,並且沒有人能知道他們在傳些什麼東西。
最後一步最簡單了,就是用 AES 加解密傳送資料,在傳送訊息前先加密,傳送訊息後再解密。
對稱式加密
對稱式加密的鑰匙是同一把鑰匙,並且是將資料切小小塊加密的,這樣子可以邊傳送邊加密訊息,或是讓全部的區塊同時加密,不浪費每一分每一秒的時間。
這應該不需要例子了吧?(偷懶一下
最後附上 OpenSSH 規格書
http://www.openssh.com/specs.html
如果有哪邊講錯的請大力指正,偷偷跟你說我其實看不太懂規格書在寫什麼,欸嘿
話說這不就是最近很紅的無密碼登入嗎